package stack;

import java.util.Stack;

/**
 * 使用递归将栈中所有元素反序
 */
public class RecursivelyReverseStack<T> {

    private final Stack<T> stack = new Stack<>();

    public void push(T t) {
        stack.push(t);
    }

    public T pop() {
        return stack.pop();
    }

    public void recursivelyPutStack() {

        T lastElementAndDelete = this.getLastElementAndDelete();
//        获得栈底元素之后，将其存入本递归的栈中
        if (!this.stack.isEmpty()) {
            recursivelyPutStack();
        }
        this.stack.push(lastElementAndDelete);
    }

    /**
     * 从栈中删除最后一个元素（栈底元素），并将其返回
     *
     * @return
     */
    private T getLastElementAndDelete() {

        T pop = stack.pop();
        if (stack.isEmpty()) {
            return pop;
        } else {
            T last = this.getLastElementAndDelete();
//             第一次运行到这一步的时候，意味着已经递归（pop()）到栈为空了
//            此时返回的 last 代表的是栈底元素，而pop是本方法所弹出（pop()）的元素，且原本在栈中的位置位于 last 之前
//            到这里已经取出栈底的元素，且这个栈底元素会一直向上返回
//            而非栈底元素在此次递归中会依次弹出，在取出栈底元素之后，递归返回时，会依次压入栈

            this.stack.push(pop);
            return last;
        }

    }

    public boolean isEmpty() {
        return stack.isEmpty();
    }

}
